import type { AxiosPromise } from "axios";

import type {
  EntityApi,
  EntityReq,
  EntityModel,
  EntityPage,
  EntityKey,
  EntityList,
} from "jmash-core";
import type { ProtobufAny } from "@/util/protobuf";

// 接口
export interface TaskApi extends EntityApi {
  // 获取我的待办事项
  findPage(req: TaskReq): AxiosPromise<FlowTaskPage>;
  // 启动流程实例
  startProcInst(req: StartProcInstReq): AxiosPromise<FlowProcInstModel>;
  // 批量 认领/取消认领/强制取回 任务
  claimTask(req: FlowClaimTaskRequest): AxiosPromise<number>;
  // 查询任务详情
  findTaskById(taskId: string): AxiosPromise<FlowTaskModel>;
  // 查询流程实例历史办理记录
  findProcInstDiagram(procInstId: string): AxiosPromise;
  // 执行任务
  completeTask(req: FlowCompleteTaskRequest): AxiosPromise<boolean>;
  // 获取允许退回的当前流程历史历史任务
  findTaskDefAllowGoback(taskId: string): AxiosPromise<FlowTaskDefList>;
  // 任务退回到选择节点
  gobackTask(req: FlowGobackTaskRequest): AxiosPromise<boolean>;
  //  分配/移交任务给某人或某些候选用户.
  assignTask(req: FlowAssignTaskRequest): AxiosPromise<boolean>;
  // 设置任务优先级.
  priorityTask(req: FlowPriorityTaskRequest): AxiosPromise<boolean>;
  // 委托用户办理任务
  delegateTask(req: FlowDelegateTaskRequest): AxiosPromise<boolean>;
  // 完成委托任务
  resolveTask(req: FlowResolveTaskRequest): AxiosPromise<boolean>;
}

export interface TaskKey extends EntityKey {
  /**
   * 任务ID
   */
  taskId?: string;
}

/**
 * 分配/移交任务给某人.
 */
export interface FlowAssignTaskRequest {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId: string;
  /**
   * 任务ID.
   */
  taskId?: string;
  /**
   * 用户ID.
   */
  userId?: string;
  /**
   * 候选用户.
   */
  candidateUser?: Array<string>;
  /**
   * 分配/移交任务备注.
   */
  comment?: string;
}

/**
 * 任务认领/取消认领/强制取回请求.
 */
export interface FlowClaimTaskRequest {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId: string;
  /**
   * 任务ID.
   */
  taskId?: Array<string>;
  /**
   * 认领/取消认领.
   */
  claim?: boolean;
  /**
   * 是否强制取回.
   */
  force?: boolean;
}

/**
 * 任务执行请求.
 */
export interface FlowCompleteTaskRequest {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId: string;
  //工作流模块
  module?: string;
  /**
   * 任务id.
   */
  taskId?: string;
  /**
   * 动作.
   */
  action?: string;
  /**
   * 办理意见.
   */
  comment?: string;
  /**
   * 流程变量.
   */
  vars: { [key: string]: ProtobufAny };
}

/**
 * 委托办理任务请求.
 */
export interface FlowDelegateTaskRequest {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId: string;
  /**
   * 任务ID.
   */
  taskId?: string;
  /**
   * 用户ID.
   */
  userId?: string;
  /**
   * 委托备注.
   */
  comment?: string;
}

/**
 * 任务退回请求.
 */
export interface FlowGobackTaskRequest {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId: string;
  /**
   * 任务id.
   */
  taskId?: string;
  /**
   * 退回到的任务节点.
   */
  taskDefKey?: string;
  /**
   * 委托备注.
   */
  comment?: string;
}

/**
 *  - Trivial: (默认).  - Minor: 次重要.  - Major: 重要.  - Critical: 关键.
 */
export type FlowPriority = "Trivial" | "Minor" | "Major" | "Critical";

/**
 * 任务优先级.
 */
export interface FlowPriorityTaskRequest {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId: string;
  /**
   * 任务ID.
   */
  taskId?: string;
  priority?: FlowPriority;
}

/**
 * 流程实例Page.
 */
export interface FlowProcInstPage extends EntityPage {
  /**
   * 流程实例列表.
   */
  results: Array<FlowProcInstModel>;
  /**
   * 当前页码.
   */
  curPage: number;
  /**
   * 页尺寸.
   */
  pageSize: number;
  /**
   * 总记录数.
   */
  totalSize: number;
}

export interface FlowProcInstKey extends EntityKey {
  /**
   * 流程实例ID.
   */
  procInstId?: string;
}

/**
 * 完成委托办理任务.
 */
export interface FlowResolveTaskRequest {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId?: string;
  /**
   * 任务ID.
   */
  taskId?: string;
  /**
   * 动作.
   */
  action?: string;
  /**
   * 完成委托备注.
   */
  comment?: string;
  /**
   * 流程变量.
   */
  vars: { [key: string]: ProtobufAny };
}

/**
 * 启动流程实例请求.
 */
export interface StartProcInstReq {
  /**
   * 用于检测重复请求的唯一字符串ID.
   */
  requestId?: string;
  /**
   * 流程启动key.
   */
  procDefKey?: string;
  /**
   * 流程业务key.
   */
  businessKey?: string;
  /**
   * 流程实例名称.
   */
  procInstName?: string;
  /**
   * 流程变量.
   */
  vars: { [key: string]: ProtobufAny };
}

/**
 * 任务定义列表.
 */
export interface FlowTaskDefList {
  /**
   * 当前页内容.
   */
  results: Array<FlowTaskDefModel>;
}

/**
 * 任务定义模型.
 */
export interface FlowTaskDefModel {
  /**
   * 任务名称.
   */
  taskName: string;
  /**
   * 任务定义Key.
   */
  taskDefKey: string;
}

// 任务请求.
export interface TaskReq extends EntityReq {
  // 租户.
  tenant?: string;
  // 当前页码.
  curPage?: number;
  // 页尺寸.
  pageSize?: number;
  // 排序名称.
  orderName?: string;
  // 是否升序排序.
  orderAsc?: boolean;
  // 优先级
  priority?: string;
  // 流程Key.
  procDefKey?: string;
  // 是否候选用户,默认否（分配用户）.
  candidate?: boolean;
  // 业务分类
  category?: string;
  // 是否包含优先级
  hasPriority?: boolean;
  // 流程实例Id
  procInstId?: string;
}

/**
 * 任务模型.
 */
export interface FlowTaskModel extends EntityModel {
  /**
   * 任务ID.
   */
  id?: string;
  /**
   * 任务名称.
   */
  name?: string;
  /**
   * 任务描述.
   */
  description?: string;
  /**
   * 优先级.
   */
  priority?: FlowPriority;
  /**
   * 所属用户.
   */
  owner?: string;
  /**
   * 分配人.
   */
  assignee?: string;
  /**
   * 流程实例ID.
   */
  processInstanceId?: string;
  executionId?: string;
  /**
   * 任务定义ID.
   */
  taskDefinitionId?: string;
  /**
   * 流程定义ID.
   */
  processDefinitionId?: string;
  /**
   * 状态.
   */
  state?: string;
  /**
   * 创建时间.
   */
  createTime?: string;
  /**
   * 认领时间.
   */
  claimTime?: string;
  /**
   * 认领用户.
   */
  claimedBy?: string;
  /**
   * 暂停时间.
   */
  suspendedTime?: string;
  /**
   * 暂停用户.
   */
  suspendedBy?: string;
  /**
   * 任务定义Key.
   */
  taskDefinitionKey?: string;
  /**
   * 过期时间.
   */
  dueDate?: string;
  /**
   * 分类.
   */
  category?: string;
  /**
   * 父任务ID.
   */
  parentTaskId?: string;
  /**
   * 租户ID.
   */
  tenantId?: string;
  /**
   * 表单Key.
   */
  formKey?: string;
  // 挂起/激活
  suspended?: boolean;
  // 委托状态
  delegationState?: string;
  //事项名称
  procInstName?: string;
  //事项开始时间
  startTime?: string;
  //起草人
  startUserId?: string;
  //业务Key
  businessKey?: string;
  //业务状态
  businessStatus?: string;
}

// 流程实例请求.
export interface ProcInstReq extends EntityReq {
  // 租户.
  tenant?: string;
  // 当前页码.
  curPage?: number;
  // 页尺寸.
  pageSize?: number;
  // 排序名称.
  orderName?: string;
  // 是否升序排序.
  orderAsc?: boolean;
  // 优先级
  priority?: string;
  // 流程Key.
  procDefKey?: string;
  // 是否候选用户,默认否（分配用户）.
  candidate?: boolean;
  // 业务分类
  category?: string;
  // 是否包含优先级
  hasPriority?: boolean;
  procDefId?: string;
}

/**
 * 任务列表.
 */
export interface FlowTaskPage extends EntityPage {
  /**
   * 任务列表.
   */
  results: Array<FlowTaskModel>;
  /**
   * 当前页码.
   */
  curPage: number;
  /**
   * 页尺寸.
   */
  pageSize: number;
  /**
   * 总记录数.
   */
  totalSize: number;
}

/**
 * 流程实例.
 */
export interface FlowProcInstModel extends EntityModel {
  /**
   * ID.
   */
  id?: string;
  /**
   * 暂停/恢复.
   */
  suspended?: boolean;
  /**
   * 是否结束.
   */
  isEnded?: boolean;
  /**
   * 活动ID.
   */
  activityId?: string;
  /**
   * 流程实例ID.
   */
  processInstanceId?: string;
  /**
   * 父ID.
   */
  parentId?: string;
  /**
   * 父执行ID.
   */
  superExecutionId?: string;
  /**
   * 根流程实例ID.
   */
  bootProcessInstanceId?: string;
  /**
   * 租户.
   */
  tenantId?: string;
  /**
   * 实例名称.
   */
  name?: string;
  /**
   * 描述.
   */
  description?: string;
  /**
   * 引用ID.
   */
  referenceId?: string;
  /**
   * 引用类型.
   */
  referenceType?: string;
  propagatedStageInstanceId?: string;
  /**
   * 流程变量.
   */
  processVariables?: { [key: string]: object };
  /**
   * 开始时间.
   */
  startTime?: string;
  /**
   * 创建用户.
   */
  startUserId?: string;
  /**
   * 业务Key.
   */
  businessKey?: string;
  /**
   * 业务状态.
   */
  businessStatus?: string;
  /**
   * 流程定义ID.
   */
  processDefinitionId?: string;
  /**
   * 流程定义名称.
   */
  processDefinitionName?: string;
  /**
   * 流程定义Key.
   */
  processDefinitionKey?: string;
  /**
   * 流程定义版本.
   */
  processDefinitionVersion?: number;
  /**
   * 流程定义分类.
   */
  processDefinitionCategory?: string;
  /**
   * 部署ID.
   */
  deploymentId?: string;
}

/**
 * 列表.
 */
export interface FlowHiTaskinstList {
  /**
   * 当前页内容.
   */
  results?: Array<FlowHiTaskinstModel>;
}

/**
 * 实体.
 */
export interface FlowHiTaskinstModel {
  id?: string;
  rev?: number;
  procDefId?: string;
  taskDefId?: string;
  taskDefKey?: string;
  procInstId?: string;
  executionId?: string;
  scopeId?: string;
  subScopeId?: string;
  scopeType?: string;
  scopeDefinitionId?: string;
  propagatedStageInstId?: string;
  name?: string;
  parentTaskId?: string;
  description?: string;
  owner?: string;
  assignee?: string;
  startTime?: string;
  claimTime?: string;
  endTime?: string;
  duration?: string;
  deleteReason?: string;
  priority?: number;
  dueDate?: string;
  formKey?: string;
  category?: string;
  tenantId?: string;
  lastUpdatedTime?: string;
}

// 查询任务用户 (监控监控/ 待办任务移交 公共组件查询候选人请求)
export interface TaskUserReq extends EntityReq {
  //租户
  tanent?: string;
  // 任务ID
  taskId?: string;
  //用户类型 有四种类型分别为 all, starter, participant, candidate
  //这里使用的是 candidate 类型
  type?: string;
}

// 查询任务用户 接口返回类型
export interface TaskUserPage extends EntityList {
  results: Array<TaskUserModel>;
}
// 查询任务用户实体
export interface TaskUserModel extends EntityModel {
  // 任务用户
  id?: string;
  // 用户类型
  type?: string;
  // 用户ID
  userId?: string;
  // 任务ID
  taskId?: string;
  // 流程实例ID
  processInstanceId?: string;
}
